#include <my_head.h>
#include "queue.h"
#define THNUM 10
//#define net_fd int
//命令信息
/*
//用户信息
typedef struct client_status{
    char user_name[20];  //用户名
    int user_len;  //用户名长度
    char password[20000]; //密码
    int islogin;  //登录状态
    char  path[2000]; //当前路径
    char path_last[2000];//切割空格后的数据
}client_status;
*/

/*
typedef struct{
    User user_inf;
    char *path;         //路径
    char *file_name;    //文件名
    int file_name_size; //文件名字大小
    int file_size;      //文件大小
    int mode;           // 1. cd   2. ls   3, puts   4, gets    5,rm     6, pwd
} Msg;
*/

typedef struct{                                                      
   //  User user_inf;      
     int mode;           // 1. cd   2. ls   3, puts   4, gets    5,rm 
     int size;           //需要的信息个数
     int msg_len;        //传出去的信息长度
     char msg[2000];         //包含ls关键字之后信息和所需要信息的拼接  
                             ////你们要什么就自行在自己的函数后面拼接
}sendMsg;                
 typedef struct{          
     char statu[200];//是否成功找到 (类似状态码)
     char msg[20000];//返回的信息 依旧是&隔开 客户端自己切割
 }recvMsg;

//登录
client_status* login(int net_fd);
//注销
bool unlogin(client_status *user, int net_fd);

// ls实现逻辑：
// socket 传递 信息到服务端 （send)
//my_ls 等函数 中调用my_send ，函数中填充结构体的信息
//调用send 把结构体信息发到服务器端口
//
bool my_ls(sendMsg msg, client_status* user, int net_fd);

bool my_cd(sendMsg msg, client_status* user, int net_fd);

bool my_rm(sendMsg msg, client_status* user, int net_fd);

bool my_pwd(sendMsg msg, client_status* user, int net_fd);

bool my_gets(sendMsg msg, client_status* user, int net_fd);

bool my_puts(sendMsg msg, client_status* user, int net_fd);
//z传输命令 的信息 fd(socket 文件描述符，)

//用于拼接出目的路径地址，
//dest；输出参数，user：存储根路径与当前路径，src：要得到的相对路径（用户输入的路径）
//适用于目录流操作的目的地址
int getpath(char* dest, client_status* user, char* src);
//发送 对应函数需要给服务端的信息 
//
//bool my_send(){

//}
//共享资源
typedef struct status_s{
   pthread_t thds[THNUM];   //存储线程id的数组
   int pthread_num;         //线程数目
   Queue_t *net_q;          //队列
   pthread_mutex_t lock;
   pthread_cond_t cond;
   bool exit_flag;          //退出信号标志位，置1时表示已经退出
} status_t;

int getparameter(char *key, char *value);

//初始化子进程
int initStatus(status_t *status);
//初始化握手用的套接字
int initSocket(int *skt_fd,char *ip,char *port);
//加入epoll监听
int addEpoll(int epl_fd, int fd);
//线程的主函数
void* thread_main(void *p);

int work(client_status* user, status_t status);

////////////////日志宏定义//////////////
void log_func(client_status *user, sendMsg *msg, int num, const char *funname, const char *name);
#define LOG(user, msg) log_func(user, msg, __LINE__, __FUNCTION__, __FILE__)
